beds_specialty <- read_csv("raw_data/beds_specialty.csv") %>%
clean_names()
Rows: 30394 Columns: 20
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (10): Quarter, QuarterQF, HB, HBQF, Location, LocationQF, Specialty, SpecialtyQF, SpecialtyName, Specialty...
dbl (5): AllStaffedBeds, TotalOccupiedBeds, AverageAvailableStaffedBeds, AverageOccupiedBeds, PercentageOccup...
lgl (5): AllStaffedBedsQF, TotalOccupiedBedsQF, AverageAvailableStaffedBedsQF, AverageOccupiedBedsQF, Percent...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
map_beds <- beds_specialty %>%
filter(location_qf == "d") %>%
mutate(year = year(yq(quarter)),
quarter = str_sub(quarter, -2),
winter_flag = if_else(quarter %in% c("Q1", "Q4"), "Winter", "Summer")) %>%
select(year, winter_flag, hb, specialty_name, percentage_occupancy) %>%
group_by(winter_flag, year, hb) %>%
summarise(percentage_occupancy = mean(percentage_occupancy)) %>%
mutate(hb_name = case_when(
hb == "S92000003" ~ "Scotland",
hb == "S08000015" ~ "Ayrshire & Arran",
hb == "S08000016" ~ "Borders",
hb == "S08000017" ~ "Dumfries & Galloway",
hb == "S08000019" ~ "Forth Valley",
hb == "S08000020" ~ "Grampian",
hb == "S08000022" ~ "Highland",
hb == "S08000024" ~ "Lothian",
hb == "S08000025" ~ "Orkney",
hb == "S08000026" ~ "Shetland",
hb == "S08000028" ~ "Western Isles",
hb == "S08000029" ~ "Fife",
hb == "S08000030" ~ "Tayside",
hb == "S08000031" ~ "Greater Glasgow & Clyde",
hb == "S08000032" ~"Lanarkshire",
TRUE ~ as.character(NA))) %>%
filter(!is.na(hb_name)) %>%
rename(hb_code = hb)
`summarise()` has grouped output by 'winter_flag', 'year'. You can override using the `.groups` argument.
write_csv(map_beds, "clean_data/map_beds.csv")
simplified_shapes <- st_transform(rmapshaper::ms_simplify(st_read(
"raw_data/nhs_hb_2019/nhs_hb_2019.shp")),"CRS:84") %>%
clean_names()
Reading layer `nhs_hb_2019' from data source
`/Users/reutersvard/codeclan/de11_project/raw_data/nhs_hb_2019/nhs_hb_2019.shp' using driver `ESRI Shapefile'
Simple feature collection with 14 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 5512.998 ymin: 530250.8 xmax: 470332 ymax: 1220302
Projected CRS: OSGB 1936 / British National Grid
# st_write(simplified_shapes, "clean_data/hb_clean.shp") If it doesn't exist, create a clean shapes file
rm(beds_specialty, map_beds, simplified_shapes)
map_beds <- read_csv("clean_data/map_beds.csv")
Rows: 180 Columns: 5
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): winter_flag, hb_code, hb_name
dbl (2): year, percentage_occupancy
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
filtered_beds <- map_beds %>%
filter(year == 2020,
winter_flag == "Winter")
shapes <- st_read("clean_data/hb_clean.shp")
Reading layer `hb_clean' from data source `/Users/reutersvard/codeclan/de11_project/clean_data/hb_clean.shp' using driver `ESRI Shapefile'
Simple feature collection with 14 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -8.649439 ymin: 54.63336 xmax: -0.7251864 ymax: 60.86076
Geodetic CRS: WGS 84
merged <- sp::merge(shapes, filtered_beds) %>%
select(hb_name, percentage_occupancy, geometry)
pal <- colorBin("BuPu", domain = merged$percentage_occupancy)
merged %>%
leaflet() %>%
addTiles() %>%
addProviderTiles(providers$OpenStreetMap) %>%
addPolygons(
fillColor = ~ pal(percentage_occupancy),
weight = 2,
opacity = 1,
color = "white",
dashArray = "3",
fillOpacity = 0.7,
highlight = highlightOptions(
weight = 5,
color = "#666",
dashArray = "",
fillOpacity = 0.7,
bringToFront = TRUE),
label = paste0(merged$hb_name, ":", " ", round(merged$percentage_occupancy), "%"),
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto"),
popup = paste0(merged$hb_name, ":", " ", round(merged$percentage_occupancy, digits = 2), "%")) %>%
leaflet::addLegend("topleft", pal = pal, values = ~percentage_occupancy,
title = "Bed Occupancy",
opacity = 1)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7ciBpbmNsdWRlID0gRn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc2YpCmxpYnJhcnkocmdkYWwpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShodG1sdG9vbHMpCmBgYAoKYGBge3Igd2FybmluZz1GQUxTRX0KYmVkc19zcGVjaWFsdHkgPC0gcmVhZF9jc3YoInJhd19kYXRhL2JlZHNfc3BlY2lhbHR5LmNzdiIpICU+JQogIGNsZWFuX25hbWVzKCkKCm1hcF9iZWRzIDwtIGJlZHNfc3BlY2lhbHR5ICU+JQogIGZpbHRlcihsb2NhdGlvbl9xZiA9PSAiZCIpICU+JSAKICBtdXRhdGUoeWVhciA9IHllYXIoeXEocXVhcnRlcikpLAogICAgICAgICBxdWFydGVyID0gc3RyX3N1YihxdWFydGVyLCAtMiksCiAgICAgICAgIHdpbnRlcl9mbGFnID0gaWZfZWxzZShxdWFydGVyICVpbiUgYygiUTEiLCAiUTQiKSwgIldpbnRlciIsICJTdW1tZXIiKSkgJT4lCiAgc2VsZWN0KHllYXIsIHdpbnRlcl9mbGFnLCBoYiwgc3BlY2lhbHR5X25hbWUsIHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KSAlPiUgCiAgZ3JvdXBfYnkod2ludGVyX2ZsYWcsIHllYXIsIGhiKSAlPiUgCiAgc3VtbWFyaXNlKHBlcmNlbnRhZ2Vfb2NjdXBhbmN5ID0gbWVhbihwZXJjZW50YWdlX29jY3VwYW5jeSkpICU+JSAKICBtdXRhdGUoaGJfbmFtZSA9IGNhc2Vfd2hlbigKICAgIGhiID09ICJTOTIwMDAwMDMiIH4gIlNjb3RsYW5kIiwKICAgIGhiID09ICJTMDgwMDAwMTUiIH4gIkF5cnNoaXJlICYgQXJyYW4iLAogICAgaGIgPT0gIlMwODAwMDAxNiIgfiAiQm9yZGVycyIsCiAgICBoYiA9PSAiUzA4MDAwMDE3IiB+ICJEdW1mcmllcyAmIEdhbGxvd2F5IiwKICAgIGhiID09ICJTMDgwMDAwMTkiIH4gIkZvcnRoIFZhbGxleSIsCiAgICBoYiA9PSAiUzA4MDAwMDIwIiB+ICJHcmFtcGlhbiIsCiAgICBoYiA9PSAiUzA4MDAwMDIyIiB+ICJIaWdobGFuZCIsCiAgICBoYiA9PSAiUzA4MDAwMDI0IiB+ICJMb3RoaWFuIiwKICAgIGhiID09ICJTMDgwMDAwMjUiIH4gIk9ya25leSIsCiAgICBoYiA9PSAiUzA4MDAwMDI2IiB+ICJTaGV0bGFuZCIsCiAgICBoYiA9PSAiUzA4MDAwMDI4IiB+ICJXZXN0ZXJuIElzbGVzIiwKICAgIGhiID09ICJTMDgwMDAwMjkiIH4gIkZpZmUiLAogICAgaGIgPT0gIlMwODAwMDAzMCIgfiAiVGF5c2lkZSIsCiAgICBoYiA9PSAiUzA4MDAwMDMxIiB+ICJHcmVhdGVyIEdsYXNnb3cgJiBDbHlkZSIsCiAgICBoYiA9PSAiUzA4MDAwMDMyIiB+IkxhbmFya3NoaXJlIiwKICAgIFRSVUUgfiBhcy5jaGFyYWN0ZXIoTkEpKSkgJT4lIAogIGZpbHRlcighaXMubmEoaGJfbmFtZSkpICU+JSAKICByZW5hbWUoaGJfY29kZSA9IGhiKQoKd3JpdGVfY3N2KG1hcF9iZWRzLCAiY2xlYW5fZGF0YS9tYXBfYmVkcy5jc3YiKQoKIyBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYSBjbGVhbiBzaGFwZXMgZmlsZQojIHNpbXBsaWZpZWRfc2hhcGVzIDwtIHN0X3RyYW5zZm9ybShybWFwc2hhcGVyOjptc19zaW1wbGlmeShzdF9yZWFkKAojICAgInJhd19kYXRhL25oc19oYl8yMDE5L25oc19oYl8yMDE5LnNocCIpKSwiQ1JTOjg0IikgJT4lCiMgICBjbGVhbl9uYW1lcygpCiMgc3Rfd3JpdGUoc2ltcGxpZmllZF9zaGFwZXMsICJjbGVhbl9kYXRhL2hiX2NsZWFuLnNocCIpIAoKcm0oYmVkc19zcGVjaWFsdHksIG1hcF9iZWRzLCBzaW1wbGlmaWVkX3NoYXBlcykKYGBgCgpgYGB7cn0KbWFwX2JlZHMgPC0gcmVhZF9jc3YoImNsZWFuX2RhdGEvbWFwX2JlZHMuY3N2IikKICAKZmlsdGVyZWRfYmVkcyA8LSBtYXBfYmVkcyAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDIwLAogICAgICAgICB3aW50ZXJfZmxhZyA9PSAiV2ludGVyIikKCnNoYXBlcyA8LSBzdF9yZWFkKCJjbGVhbl9kYXRhL2hiX2NsZWFuLnNocCIpCgptZXJnZWQgPC0gc3A6Om1lcmdlKHNoYXBlcywgZmlsdGVyZWRfYmVkcykgJT4lIAogIHNlbGVjdChoYl9uYW1lLCBwZXJjZW50YWdlX29jY3VwYW5jeSwgZ2VvbWV0cnkpCmBgYAoKYGBge3Igd2FybmluZz1GQUxTRX0KcGFsIDwtIGNvbG9yQmluKCJCdVB1IiwgZG9tYWluID0gbWVyZ2VkJHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KQoKbWVyZ2VkICU+JQogIGxlYWZsZXQoKSAlPiUKICBhZGRUaWxlcygpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJE9wZW5TdHJlZXRNYXApICU+JQogIGFkZFBvbHlnb25zKAogICAgZmlsbENvbG9yID0gfiBwYWwocGVyY2VudGFnZV9vY2N1cGFuY3kpLAogICAgd2VpZ2h0ID0gMiwKICAgIG9wYWNpdHkgPSAxLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZGFzaEFycmF5ID0gIjMiLAogICAgZmlsbE9wYWNpdHkgPSAwLjcsCiAgICBoaWdobGlnaHQgPSBoaWdobGlnaHRPcHRpb25zKAogICAgICB3ZWlnaHQgPSA1LAogICAgICBjb2xvciA9ICIjNjY2IiwKICAgICAgZGFzaEFycmF5ID0gIiIsCiAgICAgIGZpbGxPcGFjaXR5ID0gMC43LAogICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgIGxhYmVsID0gcGFzdGUwKG1lcmdlZCRoYl9uYW1lLCAiOiIsICIgIiwgcm91bmQobWVyZ2VkJHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KSwgIiUiKSwKICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucygKICAgICAgc3R5bGUgPSBsaXN0KCJmb250LXdlaWdodCIgPSAibm9ybWFsIiwgcGFkZGluZyA9ICIzcHggOHB4IiksCiAgICAgIHRleHRzaXplID0gIjE1cHgiLAogICAgICBkaXJlY3Rpb24gPSAiYXV0byIpLAogICAgcG9wdXAgPSBwYXN0ZTAobWVyZ2VkJGhiX25hbWUsICI6IiwgIiAiLCByb3VuZChtZXJnZWQkcGVyY2VudGFnZV9vY2N1cGFuY3ksIGRpZ2l0cyA9IDIpLCAiJSIpKSAlPiUKICBsZWFmbGV0OjphZGRMZWdlbmQoInRvcGxlZnQiLCBwYWwgPSBwYWwsIHZhbHVlcyA9IH5wZXJjZW50YWdlX29jY3VwYW5jeSwKICAgIHRpdGxlID0gIkJlZCBPY2N1cGFuY3kiLAogICAgb3BhY2l0eSA9IDEpCmBgYAo=